/**
 * config/index.js - 应用程序配置模块
 * 
 * 这个模块负责从环境变量中加载配置，并提供一个统一的配置对象，
 * 使应用程序的其他部分可以轻松访问这些配置。
 */

// 确保在导入任何其他模块之前加载环境变量
require('dotenv').config();

/**
 * 配置对象，包含应用程序的所有配置项
 */
const config = {
  // 应用程序基本配置
  app: {
    env: process.env.NODE_ENV || 'development',
    port: parseInt(process.env.PORT, 10) || 3000,
    name: 'Express API',
  },
  
  // API配置
  api: {
    prefix: process.env.API_PREFIX || '/api',
    version: process.env.API_VERSION || 'v1',
  },
  
  // 日志配置
  logs: {
    level: process.env.LOG_LEVEL || 'info',
  },
  
  // 数据库配置（示例，根据实际情况修改）
  db: {
    host: process.env.DB_HOST,
    port: process.env.DB_PORT,
    name: process.env.DB_NAME,
    user: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    url: process.env.DB_URL,
  },
  
  // JWT配置（示例，根据实际情况修改）
  jwt: {
    secret: process.env.JWT_SECRET || 'your-secret-key',
    refreshSecret: process.env.JWT_REFRESH_SECRET || 'your-refresh-secret-key',
    accessExpiresIn: process.env.JWT_ACCESS_EXPIRES_IN || '1h',
    refreshExpiresIn: process.env.JWT_REFRESH_EXPIRES_IN || '7d',
    expiresIn: process.env.JWT_EXPIRES_IN || '1d',
  },
  
  // CORS配置
  cors: {
    origin: process.env.CORS_ORIGIN || '*',
    methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'],
    allowedHeaders: ['Content-Type', 'Authorization'],
  },
};

/**
 * 验证必要的配置项
 * 
 * 在生产环境中，确保关键配置已设置
 */
if (config.app.env === 'production') {
  // 在生产环境中，可以添加一些配置验证
  const requiredEnvs = [
    // 'DB_URL',
    // 'JWT_SECRET',
  ];
  
  const missingEnvs = requiredEnvs.filter(env => !process.env[env]);
  
  if (missingEnvs.length > 0) {
    throw new Error(`缺少必要的环境变量: ${missingEnvs.join(', ')}`);
  }
}

module.exports = config;